package cn.spring.framework.redis.core;

import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

/**
 * @author xingkong
 * @Title: MapOperator
 * @Description: map类型操作接口
 * @date 2021/11/14 17:29
 */
public interface MapOperator {
    /**
     *map类型
     *从缓存中获取数据，如果缓存数据不存在或者缓存过期，则刷新缓存数据
     * @param key key
     * @param expire 填充缓存时的过期时间，单位毫秒
     * @param refresher 当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @return map对象
     */
    Map<String, Object> hGetAll(String key, long expire, Refresher<Map<String, Object>> refresher);

    /**
     * map类型
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则异步刷新缓存数据
     * 控制只有一个线程可以刷新缓存
     *
     * @param key       key
     * @param expire    填充缓存时的过期时间，单位毫秒
     * @param refresher 当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @return Future 对象
     */
    Future<Map<String, Object>> hGetAllAsync(String key, long expire, Refresher<Map<String, Object>> refresher);

    /**
     * map类型
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则异步刷新缓存数据
     *
     * @param key             key
     * @param expire          填充缓存时的过期时间，单位毫秒
     * @param refresher       当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @param executorService 指定以线程池实现
     * @return Future对象
     */
    Future<Map<String, Object>> hGetAllAsync(String key, long expire, Refresher<Map<String, Object>> refresher, ExecutorService executorService);


    /**
     * map类型
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则刷新缓存数据
     *
     * @param key       key
     * @param field     map中的key
     * @param expire    填充缓存时的过期时间，单位毫秒
     * @param refresher 当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @return Object对象
     */
    Object hGet(String key, String field, long expire, Refresher<Map<String, Object>> refresher);


    /**
     * map类型
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则异步刷新缓存数据
     * 控制只有一个线程可以刷新缓存
     *
     * @param key     key
     * @param field   map中的key
     * @param expire  缓存不存在数据或者缓存过期时，填充缓存时的过期时间，单位毫秒
     * @param fluster 当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @return Future 对象
     */
    Future<Map<String, Object>> hGetAsync(String key, String field, long expire, Refresher<Map<String, Object>> fluster);

    /**
     * map类型
     * 从缓存中获取数据，如果缓存数据不存在或者缓存过期，则异步刷新缓存数据
     * 控制只有一个线程可以刷新缓存
     *
     * @param key             key
     * @param field           map中的key
     * @param expire          缓存不存在数据或者缓存过期时，填充缓存时的过期时间，单位毫秒
     * @param fluster         当缓存不存在或者缓存过期时，刷新缓存数据的接口
     * @param executorService 指定线程池实现
     * @return Future对象
     */
    Future<Map<String, Object>> hGetAsync(String key, String field, long expire, Refresher<Map<String, Object>> fluster, ExecutorService executorService);


}
